package service

import (
	"encoding/json"
	"errors"
	"ginstudydemo.com/main/cache"
	"ginstudydemo.com/main/models"
	"github.com/redis/go-redis/v9"
)

type IDictService interface {
	StoreDictsInRedis()
	GetDictsFromRedis()
}
type DictService struct{}

func NewDictService() *DictService {
	return &DictService{}
}

// StoreDictsInRedis 将 字典数据 存储到 Redis
func (u DictService) StoreDictsInRedis(res map[string]models.TransformedDict) error {

	redisKey := "dict-all-data"
	resJson, err := json.Marshal(res)
	if err != nil {
		return err
	}

	// 存储到 Redis，设置一个过期时间，比如 1 小时
	err = cache.Rdb.Set(cache.Rctx, redisKey, resJson, 0).Err()
	if err != nil {
		return err
	}
	return nil
}

// GetDictsFromRedis 从 Redis 中读取字典
func (u DictService) GetDictsFromRedis() (map[string]models.TransformedDict, error) {
	var res map[string]models.TransformedDict

	redisKey := "dict-all-data"

	// 从 Redis 中获取用户记录
	resJson, err := cache.Rdb.Get(cache.Rctx, redisKey).Result()
	if errors.Is(err, redis.Nil) {
		// Redis 中没有数据
		return res, nil

	} else if err != nil {
		// 其他错误
		return res, err
	}

	// 将 JSON 反序列化
	err = json.Unmarshal([]byte(resJson), &res)
	if err != nil {
		return res, err
	}
	return res, nil
}

// UpdateDictAll 更新Redis数据服务：获取+存储Redis
func (m DictService) UpdateDictAll() (map[string]models.TransformedDict, error) {

	data, modelErr := models.GetDictALLMap()

	//数据获取失败
	if !(modelErr == nil) {
		return nil, modelErr
	}
	// 解析DictItems
	dictDatas, _ := models.ParseDictItems(data)
	// 格式化数据为 map[string]models.TransformedDict 类型
	mapDataDict := make(map[string]models.TransformedDict)

	for _, item := range dictDatas {

		mapDataDict[item.Code] = models.TransformTransformedDict(item)
	}
	//存入Redis
	NewDictService().StoreDictsInRedis(mapDataDict)
	return mapDataDict, nil

}

// GetDictAll 获取所有字典数据
func (m DictService) GetDictAll() (map[string]models.TransformedDict, error) {

	data, modelErr := models.GetDictALLMap()

	if !(modelErr == nil) {
		return nil, modelErr
	}

	dictDatas, _ := models.ParseDictItems(data)

	mapDataDict := make(map[string]models.TransformedDict)

	for _, item := range dictDatas {

		mapDataDict[item.Code] = models.TransformTransformedDict(item)
	}
	return mapDataDict, nil
}
